import store from '@/store'
import { Toast } from 'antd-mobile'
import axios from 'axios'
import history from './history'
import { getTokenInfo, removeTokenInfo, setTokenInfo } from './storage'

// 请求基地址
export const baseURL = 'http://geek.itheima.net'

// 创建 axios 实例
const http = axios.create({
  baseURL: baseURL,
  timeout: 5000,
})

// 请求拦截器
http.interceptors.request.use(
  function (config: any) {
    const { token } = getTokenInfo()
    if (token) config.headers.Authorization = `Bearer ${token}`
    return config
  },
  function (err) {
    return Promise.reject(err)
  },
)

// 响应拦截器
http.interceptors.response.use(
  function (response) {
    return response.data
  },
  async function (err) {
    // 如果因为网络原因，response没有，给提示消息
    if (!err.response) {
      Toast.show({ content: '网络繁忙，请稍后重试', maskClassName: 'and_toast_err' })
    } else {
      // 网络没问题，后台返回了有数据
      const { response, config } = err
      const { refresh_token } = getTokenInfo()

      // 是401错误，且有刷新token
      if (response.status === 401) {
        // 尝试发请求，获取新的token,注意：刷新token发送请求，不能使用封装的http
        try {
          const res = await axios({
            method: 'put',
            url: baseURL + '/v1_0/authorizations',
            headers: {
              Authorization: 'Bearer ' + refresh_token,
            },
          })
          // debugger
          // 刷新成功
          // 把新的token保存起来
          const tokenInfo = {
            token: res.data.data.token,
            refresh_token: refresh_token,
          }
          // console.log(tokenInfo)
          // 保存到redux中
          store.dispatch({ type: 'user/token', payload: tokenInfo })
          // 保存到localstorage中
          setTokenInfo(tokenInfo)

          // token刷新成功后，重新把最开始失败的请求重新发一次
          return http(config)
        } catch {
          // 刷新token失败, 刷新token过期
          removeTokenInfo()
          store.dispatch({ type: 'user/token', payload: { token: '', refresh_token: '' } })
          // 替换到登录页
          history.replace({
            pathname: '/login',
            state: {
              from: history.location.pathname,
            },
          })
          Toast.show({ content: '登录信息失效，请重新登录', maskClassName: 'and_toast_err' })

        }
        // console.log(config)
      } else {
        console.log('----------', response);
        // 不是token失效的问题
        Toast.show({ content: response.data.message, maskClassName: 'and_toast_err' })
        // 网络没问题，且是401 token失效的问题
        // 1. 判断有没有刷新token
        if (!refresh_token) {
          // 没有token
          // 替换到登录页
          history.replace({
            pathname: '/login',
            state: {
              from: history.location.pathname,
            },
          })
        }
      }
    }

    return Promise.reject(err)
  },
)

// 导出 axios 实例
export default http